package services

import (
	"context"
	"encoding/json"
	"fmt"
	"strconv"

	mainmodels "gitee.com/wangshh_123/cross-pay-go/src/models"
	"gitee.com/wangshh_123/cross-pay-go/src/platform/providers/hlPay"
	hlpaymodels "gitee.com/wangshh_123/cross-pay-go/src/platform/providers/hlPay/models"
	"gorm.io/gorm"
)

// GetAccountInfo 获取账户信息
// 参数:
//   - ctx: 上下文
//   - client: HlPay客户端
//   - db: 数据库连接
//
// 返回:
//   - *hlpaymodels.AccountInfoResponse: 账户信息响应
//   - error: 错误信息
func GetAccountInfo(ctx context.Context, client *hlPay.HlPayClient, db *gorm.DB) (*hlpaymodels.AccountInfoResponse, error) {
	// 调用API获取账户信息
	respBody, err := client.Get(ctx, "/hlPayApi/account/info")
	if err != nil {
		return nil, fmt.Errorf("获取账户信息失败: %v", err)
	}

	// 解析响应
	var response hlpaymodels.AccountInfoResponse
	if err := json.Unmarshal(respBody, &response); err != nil {
		return nil, fmt.Errorf("解析账户信息响应失败: %v", err)
	}

	// 检查响应状态
	if response.Code != 200 {
		return nil, fmt.Errorf("获取账户信息失败，错误码: %d，错误信息: %s", response.Code, response.Msg)
	}

	// 计算用户总余额
	totalBalance, err := calculateTotalBalance(db)
	if err != nil {
		return nil, fmt.Errorf("计算用户总余额失败: %v", err)
	}

	// 设置总余额
	response.Data.TotalBalance = totalBalance

	// 计算可划拨余额 = available - totalBalance
	availableFloat, err := strconv.ParseFloat(response.Data.Available, 64)
	if err != nil {
		return nil, fmt.Errorf("解析可用余额失败: %v", err)
	}
	response.Data.AvailableBalance = availableFloat - totalBalance

	return &response, nil
}

// GetAvailableBalance 获取可划拨余额
// 参数:
//   - ctx: 上下文
//   - client: HlPay客户端
//   - db: 数据库连接
//
// 返回:
//   - float64: 可划拨余额
//   - error: 错误信息
func GetAvailableBalance(ctx context.Context, client *hlPay.HlPayClient, db *gorm.DB) (float64, error) {
	// 调用API获取账户信息
	respBody, err := client.Get(ctx, "/hlPayApi/account/info")
	if err != nil {
		return 0, fmt.Errorf("获取账户信息失败: %v", err)
	}

	// 解析响应
	var response hlpaymodels.AccountInfoResponse
	if err := json.Unmarshal(respBody, &response); err != nil {
		return 0, fmt.Errorf("解析账户信息响应失败: %v", err)
	}

	// 检查响应状态
	if response.Code != 200 {
		return 0, fmt.Errorf("获取账户信息失败，错误码: %d，错误信息: %s", response.Code, response.Msg)
	}

	// 计算用户总余额
	totalBalance, err := calculateTotalBalance(db)
	if err != nil {
		return 0, fmt.Errorf("计算用户总余额失败: %v", err)
	}

	// 计算可划拨余额 = available - totalBalance
	availableFloat, err := strconv.ParseFloat(response.Data.Available, 64)
	if err != nil {
		return 0, fmt.Errorf("解析可用余额失败: %v", err)
	}

	return availableFloat - totalBalance, nil
}

// calculateTotalBalance 计算用户总余额
// 参数:
//   - db: 数据库连接
//
// 返回:
//   - float64: 总余额
//   - error: 错误信息
func calculateTotalBalance(db *gorm.DB) (float64, error) {
	var totalBalance float64

	// 查询所有活跃状态的账户余额总和
	err := db.Model(&mainmodels.HlPayAccountBalance{}).
		Where("status = ?", "active").
		Select("COALESCE(SUM(real_time_balance), 0)").
		Scan(&totalBalance).Error

	if err != nil {
		return 0, fmt.Errorf("查询账户余额失败: %v", err)
	}

	return totalBalance, nil
}

// CreateMatrixAccount 创建HlPay矩阵账户
// 参数:
//   - client: HlPay客户端
//   - bodyBytes: 请求体字节数组
//
// 返回:
//   - []byte: 响应数据
//   - error: 错误信息
func CreateMatrixAccount(ctx context.Context, client *hlPay.HlPayClient, bodyBytes []byte) ([]byte, error) {
	path := "/hlPayApi/matrix/create"

	resp, err := client.Post(ctx, path, bodyBytes)
	if err != nil {
		return nil, fmt.Errorf("创建矩阵账户失败: %v", err)
	}
	return resp, nil
}
